from sqlalchemy import Column, Integer, String, DateTime, Text, JSON, text
from dao.postgresql_connect import Base
from datetime import datetime, UTC
import pytz

def get_shanghai_time():
    """获取上海时间"""
    return datetime.now(pytz.timezone('Asia/Shanghai'))

class RequestLog(Base):
    """
    请求日志模型
    用于记录系统中所有HTTP请求的详细信息，包括请求参数、响应结果和处理时间等
    
    属性说明：
        - id: 主键，自增长的整数
        - timestamp: 请求发生的时间戳
        - ip_address: 发起请求的客户端IP地址
        - route: 请求的路由路径
        - method: HTTP请求方法（GET, POST, PUT, DELETE等）
        - request_body: 请求体内容，JSON格式（对于POST, PUT请求）
        - query_params: URL查询参数，JSON格式
        - headers: 请求头信息，JSON格式（排除敏感信息）
        - response_status: HTTP响应状态码
        - response_body: 响应体内容，JSON格式
        - processing_time: 请求处理时间（毫秒）
        - user_agent: 客户端浏览器/应用信息
        - user_id: 发起请求的用户ID（如果已认证）
        - user_name: 发起请求的用户名称（如果已认证）
        - error_message: 如果请求处理出错，记录错误信息
    """
    __tablename__ = "request_logs"

    # 主键ID
    id = Column(Integer, primary_key=True, index=True)
    # 请求时间戳，自动设置为当前时间
    timestamp = Column(DateTime, default=lambda: datetime.now(UTC), server_default=text('CURRENT_TIMESTAMP'), nullable=False, comment='请求时间')
    # 客户端IP地址，必填
    ip_address = Column(String, nullable=False)
    # 请求路由路径，必填
    route = Column(String, nullable=False)
    # HTTP请求方法，必填
    method = Column(String, nullable=False)
    # 请求体，可为空（GET请求没有请求体）
    request_body = Column(JSON, nullable=True)
    # URL查询参数，可为空
    query_params = Column(JSON, nullable=True)
    # 请求头信息（过滤后），可为空
    headers = Column(JSON, nullable=True)
    # HTTP响应状态码，可为空（请求未完成时）
    response_status = Column(Integer, nullable=True)
    # 响应体内容，可为空
    response_body = Column(JSON, nullable=True)
    # 请求处理时间（毫秒），可为空
    processing_time = Column(Integer, nullable=True)
    # 客户端信息，可为空
    user_agent = Column(String, nullable=True)
    # 用户ID，可为空（未登录用户）
    user_id = Column(String(36), nullable=True)
    # 用户名称，可为空（未登录用户）
    user_name = Column(String, nullable=True)
    # 错误信息，可为空（请求正常时）
    error_message = Column(Text, nullable=True) 